package com.link.base.base.accnt.service;

import com.link.base.base.accnt.model.*;
import com.link.base.base.approval.model.Flow;
import com.link.base.base.fund.model.BillDetailModel;
import com.link.base.base.orgnization.model.Orgnization;
import com.link.base.base.product.model.PriceList;
import com.link.base.basic.model.ListOfValue;
import com.link.core.basic.service.BasicService;

import java.util.List;
import java.util.Map;

/**
 * Copyright  hande Company. All Rights Reserved.
 *
 * @author unknwon
 * @version 1.0
 * @date: 2018/11/7 15:54
 */

public interface AccountService extends BasicService<Account> {

    /**
     * 客户查询
     *
     * @author jianlongwen
     * @date 2019/03/24
     * @param entity 客户id
     */
    public List<Account> selectAccountHierarchy(Account entity) throws Exception;

    /**
     * 修改状态
     *
     * @param entity
     * @throws Exception
     */
    public void statusUpdate(Account entity) throws Exception;

    /**
     * 审批回调方法
     *
     * @param objectId
     * @param param1
     * @param param2
     * @param param3
     * @param param4
     * @param param5
     * @throws Exception
     */
    public void statusUpdateByApproval(Long objectId, String param1, String param2, String param3, String param4,
                                       String param5) throws Exception;

    /**
     * 新建拜访记录时选择客户
     *
     * @param entity
     * @return
     */

    public List<Account> queryVisitAccountPage(Account entity);

    /**
     * <p>修改主要联系人</p>
     *@author heqiqian
     *@param account
     */

    public void mainContactUpdate(Account account);

    /**
     * 修改主要合同
     *@author heqiqian
     *@param account
     */
    public void mainAgrUpdate(Account account);

    /**
     * <p>插入数据到联系人表</p>
     *@author yrf
     * @param account
     */

    public void copyToContactInsert(Account account);

    /**
     * <p>新建数据到到 客户子页签：单权限表</p>
     * @author yrf
     * @param account
     */
    public void copyToBsScopeInsert(Account account);

    /**
     * <p>更新客户头信息</p>
     * @author yrf
     * @param account
     */
    public void acctHeaderUpdate(Account account);

    /**
     * <p>更新客户详细信息</p>
     *@author yrf
     *@param account
     *
     */
    public void acctDetailUpdate(Account account);

    /**
     * <p>更新联系人数据</p>
     * @author yrf
     * @param account
     */
    public void copyToContactUpdate(Account account);


    /**
     * <p>更新dms公司信息</p>
     *
     * @param account
     */
    public void updateDmsCompany(Account account);

    /**
     * 查找非子客户及本身
     *
     * @param account
     * @return
     * @throws Exception
     */
    public List<Account> queryAccountListRemoveIdAndChildrenPage(Account account) throws Exception;

    /**
     * @param entity
     * @return
     * @throws Exception
     */
    public List<Account> accountTreeList(Account entity) throws Exception;


    /**
     * 根据客户查询子客户
     *
     * @param account
     * @throws Exception
     */
    public void queryTreeByRoot(Account account) throws Exception;


    /**
     * 经销审核:自动创建该经销商的三个资金账户（余额为0）， 然后新建一个外部用户，其用户名为手机号码。 密码为随机的6位数字。 然后需要给用户发送短信过去。
     *
     * @param entity
     * @throws Exception
     */
    public void dealerAudit(Account entity) throws Exception;

    /**
     * 查询区域客户情况
     *
     * @param entity
     * @return
     * @throws Exception
     */
    public List<Account> queryAccountOfDistrictPage(Account entity) throws Exception;

    /**
     * 获得区域客户报表html
     *
     * @param list
     * @return
     * @throws Exception
     */
    public String getAccountReportHtml(List<Account> list) throws Exception;

    /**
     * 更新主要资金账户
     *
     * @param account
     * @throws Exception
     * @Auth HuanglJ
     */
    public void mainBillUpdate(Account account) throws Exception;

    /**
     * 获取消费者列表
     *
     * @param t
     * @return
     */
    public List<Account> getAccountList(Account t);

    /**
     * 根据客户和组织，初始化客户组织
     *
     * @param accnt
     * @param orgList
     * @param listOfOrg
     * @throws Exception
     */
    public void upgradeToOrg(Account accnt, Orgnization orgList, ListOfValue listOfOrg) throws Exception;

    /**
     * 创建经销商的销售价格头表
     * @author heqiqian
     * @param account 经销商
     * @param orgId   组织ID
     * @return PriceList
     * @throws Exception
     * @date 2018年5月22日
     */
    public PriceList createDealerSalePriceHead(Account account, Long orgId) throws Exception;

    /**
     * 查询指定条件下的客户
     *
     * @param account
     * @return Accounts
     * @throws Exception
     */
    public List<Account> queryAllByAccntStatus(Account account) throws Exception;

    /***
     * 查询符合生成对账单的客户
     * @param billDetailModel
     * @return BillDetailModels
     * @throws Exception
     */
    public List<BillDetailModel> queryAllBillAccntByCondtion(BillDetailModel billDetailModel) throws Exception;

    /**
     * 获取虚拟消费者（系统参数）
     *
     * @param corpId
     * @return
     */
    String getVirtualAccount(Long corpId);

    /**
     * 检查消费者是否存在
     *
     * @param account
     * @return Account
     * @throws Exception
     */
    Account checkAccount(Account account) throws Exception;

    /**
     * 通过客户id查询标签列表
     *
     * @param record
     * @return
     * @throws Exception
     * @date 2017年3月27日
     */
    public List<TagItem> queryTagsById(TagItem record) throws Exception;

    /**
     * 更新标签列表信息
     *
     * @param list
     * @throws Exception
     */
    public void updateTagList(ListOfTags list) throws Exception;

    /**
     * 删除客户标签信息
     * @author lizt
     * @param item
     * @throws Exception
     * @date 2017年3月29日
     */

    public void deleteTagById(TagItem item) throws Exception;

    /**
     * 查询企点客户的状态数据
     *
     * @param entity
     * @return
     * @throws Exception
     */
    public List<TagItem> queryQdAccntTags(TagItem entity) throws Exception;


    /**
     * 查询企点客户的状态数据
     *
     * @param entity
     * @return
     * @throws Exception
     */
    public List<TagItem> queryQdAccntTagGroups(TagGroup entity) throws Exception;

    public List<String> queryGuideList(Account account) throws Exception;

    /**
     * 插入中间表
     *
     * @param entity
     * @throws Exception
     */
    public void accountPersonInsert(AccountPerson entity) throws Exception;

    /**
     * 生成客户二维码
     *
     * @author SiYe
     * 2017年8月8日
     */
    public Account saveAccnt2CodeInfoNew(Account record) throws Exception;

    /**
     * 查询客户头像url及更多信息
     * @author ouyangzhenqiang
     * @param record
     * @return
     * @throws Exception
     * @date 2017年8月8日
     */
    public Account queryUpdWxInfo(Account record) throws Exception;


    /**
     * 清空客户微信seq
     *
     * @param record
     * @throws Exception
     */
    public void emptyAccntSeq(Account record) throws Exception;

    /**
     * 根据wxopenid查询客户
     *
     * @param wxOpenId
     * @param corpId
     * @return
     * @throws Exception
     */
    public Account queryByWxOpenId(String wxOpenId, Long corpId) throws Exception;

    /**
     * 查询微信关注者
     *
     * @param entity
     * @return
     * @throws Exception
     */
    public List<Account> queryByWeixin(Account entity) throws Exception;


    /**
     * 根据手机号查询微信客户
     *
     * @param entity
     * @return
     * @throws Exception
     */
    public List<Account> queryWeixinByMobilePhone(Account entity) throws Exception;

    /**
     * 查询客户根据微信8位码-企点
     *
     * @param entity
     * @return
     * @throws Exception
     */
    public Account queryByWxSeq(Account entity) throws Exception;

    /**
     * 查询客户简单信息 根据wxopenid
     *
     * @param wxOpenId
     * @return
     * @throws Exception
     */
    public Account querySimpleAccntByWxOpenId(String wxOpenId) throws Exception;

    /**
     * 扫描微信公众号时新建客户
     *
     * @param entity
     * @throws Exception
     */
    public void wxAccountInsertByInterface(Account entity) throws Exception;


    /**
     * 将微信客户关联门店客户
     * * 更新门店客户的wxOwnOpenId 及 wxAccountId
     *
     * @param entity
     * @throws Exception
     */
    public void accountWxOwnOpenIdUpdate(Account entity) throws Exception;

    /**
     * 更新微信seq
     *
     * @param entity
     * @throws Exception
     */
    public void wx2codeUpdate(Account entity) throws Exception;

    /**
     * 根据小程序openId查询消费者信息
     *
     * @param account
     * @return
     * @throws Exception
     */
    public Account queryConsumerByOpenId(Account account) throws Exception;

    /**
     * 插入消费者信息，小程序登录接口用
     * @author Lizt
     * @param account
     * @throws Exception
     * @date 2018/7/31
     */
    public void addConsumer(Account account) throws Exception;

    /**
     * 查询当前用户信息
     * @author Lizt
     * @return Account
     * @throws Exception
     * @date 2018/8/20
     */
    Account queryConsumerInfo() throws Exception;

    /**
     * 客户签约提交审批
     *
     * @param entity
     * @param approvalDetail
     * @throws Exception
     */
    public void accntSigningSubmit(Account entity, String approvalDetail) throws Exception;

    /**
     * 提交审批客户测试状态改变
     *
     * @param objectId
     * @param param1
     * @param param2
     * @param param3
     * @param param4
     * @param param5
     * @throws Exception
     */
    public void accntSigningStatusUpdate(Long objectId, String param1, String param2, String param3, String param4, String param5) throws Exception;

    /**
     * 初始化客户信息
     *
     * @param account
     * @throws Exception
     */
    public void initializeAcct(Account account) throws Exception;

    /**
     * 客户签约审批处理-审批成功后更新客户信息和合同信息
     *
     * @param entity
     * @throws Exception
     */
    public void accntApprovalObjectUpdate(AccountApprovalInfo entity) throws Exception;

    /**
     * 查询小程序门店
     * @param temp
     * @return
     * @throws Exception
     */
    List<Account> queryMpStoreByExamplePage(Account temp) throws Exception;

    /**
     * 根据personLinkId查询客户列表
     * @author LiQun
     * @date 2018/12/6
     * @param accountPerson 客户-人物中间表对象 personId 人的linkId
     * @return 客户对象
     * @throws Exception 异常信息
     */
    Account queryAccountByPersonId(AccountPerson accountPerson) throws Exception;

    /**
     * 根据personLinkId列表查询客户列表
     * @author LiQun
     * @date 2018/12/6
     * @param list 客户-人物中间表对象 personId 人的linkId
     * @return 客户对象
     * @throws Exception 异常信息
     */
    List<Account> queryAccountByPersonIdList(List<AccountPerson> list) throws Exception;

    /**
     * 根据一个消费者信息，带出消费者对应所有会员信息
     * @author wangdawei
     * @param entity
     * @return
     * @throws Exception
     */
    List<Account> queryAcctListById(Account entity) throws Exception;

    /**
     * 小程序获取到手机号码后更新消费者手机号码信息
     * @author KuangRuifeng
     * @date 2018/12/18
     * @param record 手机号码信息
     * @return 更新结果和信息
     * @throws Exception 异常信息
     */
    Map<String, Object> updMobilePhoneInfo(Account record) throws Exception;

    /**
     * 查询访客信息
     * @param entity
     * @return
     * @throws Exception
     */
    Account queryAcctAndMember(Account entity) throws Exception;

    /**
     * 判断当前小程序用户尝试登陆使用的手机号码是否合法
     * @author KuangRuifeng
     * @date 2019/3/14
     * @param record 手机号码信息
     * @return 判断结果和信息
     * @throws Exception 异常
     */
    Map<String, Object> checkMPLoginPhone(Account record) throws Exception;

    /**
     * 新建消费者，对接DMP新建消费者接口，由DMP返回渠道消费者及父消费者（可无）
     * 再将返回信息保存至link数据库
     *
     * @author NingLanhao
     * @param entity
     * @return Account 新建后的数据
     * @date 2019-03-26 11:04
     * @throws Exception 异常
     */
    Account saveAccountToDmp(Account entity) throws Exception ;

    /**
     * 修改消費者
     * @author zengchi
     * @date 2019-09-26 13:56
     * @param entity 消费者
     *
     */
    void updateConsumer(Account entity) throws Exception;

    /**
     * 查询消费者
     * @author zengchi
     * @date 2019-09-30 13:56
     * @param id 消费者id
     *
     */
    Account queryConsumerById(Long id) throws Exception;

    /**
     * 微信更新消费者
     *
     * @author huanglongjian
     * @date 2019-10-22 14:19
     * @param
     * @return
     */
    Account wxUpdateAccount(Account account) throws Exception;

    /**
     * 提交客户
     * @author yangxiaolin
     * @date 2020-10-29 15:10
     */
    public void accountSubmit(Account entity) throws Exception;

    public void apprNewAccount(Flow flow, String arg1, String arg2, String arg3, String arg4, String arg5) throws Exception;

    public List<Account> queryAccountListByAcctChange(Account entity) throws Exception;

    public void auditUpdate(Account account) throws Exception;

    void accountChangeAppr(AcctChange acctChange);

    public void accountAudit(Account entity) throws Exception;

    /**
     * 客户层级关系（父与子）
     * @author yangxiaolin
     * @date 2020/12/16 11:53
     */
    public List<Account> accountLevelReport(Account entity) throws Exception;

    /**
     * 更新客户编码
     * @author yangxiaolin
     * @date 2021/12/16 11:53
     */
    public void updateAcctCode(Account entity) throws Exception;
}
